package main

import "fmt"

func main() {
	s := "au"
	fmt.Println(lengthOfLongestSubstring(s))
}

//给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。
func lengthOfLongestSubstring(s string) int {
	return countBySlidingWindow(s)
}

/**
 * @Description: 通过滑动窗口实现
 */
func countBySlidingWindow(s string) int {
	begin, result := 0, 0
	//temp用来存储字符和下标的关系
	tempMap := make(map[byte]int)
	sByte := []byte(s)
	for end := 0; end < len(sByte); end++ {
		//若map中已存在相同字符，则将begin更新到 最后这个字符出现的较大位置处
		if value, ok := tempMap[sByte[end]]; ok {
			begin = max(begin, value)
		}
		//结果等于尾-头+1的最大值
		result = max(result, end-begin+1)
		//更新字符的最后一个下标
		tempMap[sByte[end]] = end + 1
	}
	return result
}

/**
 * @Description:根据两个for循环来实现[暴力破解]
 */
func countByTwoFor(s string) int {
	if len(s) == 1 {
		return 1
	}
	temp := []byte(s)
	result, begin := 0, 0
	for begin < len(temp) {
		tempMap := make(map[byte]bool)
		tempLength := 0
		for i := begin; i < len(temp); i++ {
			if _, ok := tempMap[temp[i]]; !ok {
				tempMap[temp[i]] = true
				tempLength++
			} else {
				break
			}
			result = max(tempLength, result)
		}
		begin++
	}

	return result
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
